package com.herench.bs.agent;

import com.herench.bs.support.CleverContextAware;

import java.util.List;
import java.util.Map;

/**
 * Created by ThinkPad on 2017/8/9.
 */
public interface IPersonAgent extends CleverContextAware {

    /**
     * 仅用手机号注册用户（不包含个人信息）
     *
     * @param phone            手机号
     * @param password         密码
     * @param verificationCode 手机验证码
     * @param channelCode      渠道编码
     * @param registerChannel  注册渠道
     * @param appImei          手机IMEI
     * @param webchat          微信号
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> phoneRegister(String phone, String password, String verificationCode, String channelCode, String registerChannel, String appImei, String webchat) throws Exception;

    /**
     * 注册用户（包含个人信息）
     *
     * @param name             姓名
     * @param phone            手机号
     * @param idCard           身份证号
     * @param password         密码
     * @param verificationCode 手机验证码
     * @param channelCode      渠道编码
     * @param registerChannel  注册渠道
     * @param appImei          手机IMEI
     * @param webchat          微信号
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> personRegister(String name, String phone, String idCard, String password, String verificationCode, String channelCode, String registerChannel, String appImei, String webchat) throws Exception;


    /**
     * 注册用户(供非手机终端使用)
     *
     * @param name            姓名
     * @param phone           手机号
     * @param idCard          身份证号
     * @param password        密码
     * @param hospitalCode    注册所用的医院代码
     * @param registerChannel 注册渠道
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> register(String name, String phone, String idCard, String password, String hospitalCode, String registerChannel);

    /**
     * 删除注册用户（测试用）
     *
     * @param userName
     * @return 返回执行后的结果
     */
    public Map<String, Object> deleteUser(String userName);

    /**
     * 删除就诊人（测试用）
     *
     * @param personId
     * @return 返回执行后的结果
     */
    public Map<String, Object> deletePerson(String personId);

    /**
     * 删除号码相关就诊人（测试用）
     *
     * @param phone
     * @return 返回执行后的结果
     */
    public Map<String, Object> deleteAllPerson(String phone);

    /**
     * 修改就诊人信息
     *
     * @param personId
     * @return 返回执行后的结果
     */
    public Map<String, Object> updatePersonName(String personId,String phone,String name);

    /**
     * 问题反馈
     *
     * @param serialNo
     * @param hospitalCode
     * @param username
     * @param feedContent
     * @param feedDate
     * @param state
     * @return 返回执行后的结果
     */
    public Map<String, Object> feedBack(String serialNo, String hospitalCode, String username, String feedContent, String feedDate, String state);

    /**
     * 重置密码(供非手机终端使用)
     *
     * @param phone            姓名
     * @param personId         用户id
     * @param verificationCode 验证码
     * @param password         密码
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> resetPassword(String phone, String personId, String verificationCode, String password);

    /**
     * 重置密码
     *
     * @param phone    姓名
     * @param personId 用户id
     * @param password 密码
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> resetPassword(String phone, String personId, String password);

    /**
     * 重置密码(仅限于超级管理员|非手机终端使用)
     *
     * @param phone    姓名
     * @param password 密码
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> resetPassword(String phone, String password);

    /**
     * 根据验证码修改密码
     *
     * @param channelCode      渠道编码
     * @param user             用户id
     * @param oldPassword      老密码
     * @param newPassword      新密码
     * @param verificationCode 手机验证码
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> modifyPassword(String channelCode, String user, String oldPassword, String newPassword, String verificationCode) throws Exception;

    /**
     * 修改姓名
     *
     * @param personId 用户id
     * @param name     新姓名
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> modifyInfo(String personId, String name);


    /**
     * 修改用户基本信息
     *
     * @param user   用户
     * @param idCard 新身份证id
     * @param name   新姓名
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> modifyInfoByIdCard(String user, String idCard, String name);

    /**
     * 修改手机号
     *
     * @param personId 用户id
     * @param phone    手机号
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> modifyPhone(String personId, String phone);

    /**
     * 修改用户状态
     *
     * @param personId 用户id
     * @param state    状态
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> modifyState(String personId, String state);

    /**
     * 修改用户认证状态
     *
     * @param personId 用户id
     * @param auth     认证状态
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> modifyAuth(String personId, String auth);

    /**
     * 添加就诊卡
     *
     * @param channelCode 渠道编码
     * @param idCard      患者身份证
     * @param cardType    卡类别
     * @param cardNum     卡号
     * @param defaultFlag 是否默认卡
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> addTreatmentCard(String channelCode, String idCard, String cardType, String cardNum, String defaultFlag);

    /**
     * 修改就诊卡
     *
     * @param personId 患者用户id
     * @param cardType 卡类别
     * @param cardNum  卡号
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> modifyTreatmentCard(String personId, String cardType, String cardNum);


    /**
     * 删除就诊卡
     *
     * @param personId 患者用户id
     * @param cardType 卡类别
     * @param cardNum  卡号
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> deleteTreatmentCard(String personId, String cardType, String cardNum);

    /**
     * 根据患者用户id查询就诊卡
     *
     * @param personId 患者用户id
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> loadTreatmentCard(String personId);

    /**
     * 根据主用户添加子用户
     *
     * @param masterUserId     主用户id
     * @param name             姓名
     * @param idCard           身份证号
     * @param registerChannel  注册渠道
     * @param mobile           就诊人手机号
     * @param verificationCode 验证码
     * @param defaultFlag      是否默认就诊人：   "1" 默认就诊人  "0" 非默认就诊人
     * @param verifyPhone      核实手机：1核实 ；0 不核实
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> addRelatedUserId(String masterUserId, String name, String idCard, String registerChannel, String mobile, String verificationCode, String defaultFlag, String verifyPhone);

    /**
     * 根据主用户删除子用户
     *
     * @param masterUserId 主用户id
     * @param name         姓名
     * @param idCard       身份证号
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> removeRelatedUser(String masterUserId, String name, String idCard);

    /**
     * 根据主用户查询子用户列表
     *
     * @param masterUserId 主用户id
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> loadRelatedUsers(String masterUserId);

    /**
     * 根据患者用户id和医院代码添加使用授权
     *
     * @param personId     患者用户id
     * @param hospitalCode 医院代码
     * @param authWays     授权渠道
     * @param mark         备注
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> addHospitalAccessAuth(String personId, String hospitalCode, String authWays, String mark);

    /**
     * 根据患者用户id和医院代码删除使用授权信息
     *
     * @param personId     患者用户id
     * @param hospitalCode 医院代码
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> deleteHospitalAccessAuth(String personId, String hospitalCode);

    /**
     * 上传头像
     *
     * @param personId       患者用户id
     * @param avatarFilePath 头像文件路径
     * @return 返回执行后的结果信息
     */
    public Map<String, Object> uploadAvatar(String personId, String avatarFilePath);

    /**
     * 添加收藏
     *
     * @param channelCode    渠道编码
     * @param user           患者用户id
     * @param collectType    收藏类型
     * @param collectContent 收藏代码
     * @return 返回执行后的结果
     */
    public Map<String, Object> addEnshrine(String channelCode, String user, String collectType, String collectContent);

    /**
     * 删除收藏内容
     *
     * @param collectContent 医生id
     * @param userId
     * @return 返回执行后的结果
     */
    public Map<String, Object> deleteEnshrine(String collectContent, String userId);

    /**
     * 检测收藏状态
     *
     * @param collectContent 查询编码
     * @param userId         患者用户id
     * @param collectType    医生代码
     * @return 返回执行后的结果
     */
    public Map<String, Object> checkEnshrineStatus(String collectContent, String userId, String collectType);

    /**
     * 加载收藏夹内容
     *
     * @param channelCode 渠道编码
     * @param userId      患者用户id
     * @return 返回执行后的结果
     */
    public Map<String, Object> loadEnshrine(String channelCode, String userId);

    /**
     * 根据身份证密码登录
     *
     * @param channelCode 渠道编码
     * @param idCard      身份证号
     * @param password    密码
     * @return 返回执行后的结果
     */
    public Map<String, Object> login(String channelCode, String idCard, String password);

    /**
     * 根据身份证号验证码登录
     *
     * @param channelCode      渠道编码
     * @param idCard           身份证号
     * @param verificationCode 验证码
     * @return 返回执行后的结果
     */
    public Map<String, Object> loginByIdCardAndVerificationCode(String channelCode, String idCard, String verificationCode);

    /**
     * 根据手机号和验证码登录
     *
     * @param channelCode      渠道编码
     * @param phone            手机号
     * @param verificationCode 验证码
     * @return 返回执行后的结果
     */
    public Map<String, Object> loginByPhoneAndVerificationCode(String channelCode, String phone, String verificationCode) throws Exception;

    /**
     * 根据手机号和密码登录
     *
     * @param channelCode 渠道编码
     * @param phone       手机号
     * @param passwd      密码
     * @param imei        移动设别imei编号
     * @param openId      微信或其他网页登录唯一身份识别码
     * @param source      来源：1.安卓，2.IOS  3微网站
     * @return 返回执行后的结果
     */
    public Map<String, Object> loginByPhoneAndPasswd(String channelCode, String phone, String passwd, String imei, String openId, String source);

    /**
     * 根据手机号和验证码登录
     *
     * @param channelCode      渠道编码
     * @param phone            手机号
     * @param webchat          微信号
     * @param verificationCode 验证码
     * @return 返回执行后的结果
     */
    public Map<String, Object> loginByPhoneAndVerificationCodeOnWebChat(String channelCode, String phone, String webchat, String verificationCode);

    /**
     * 根据微信号和密码登录
     *
     * @param channelCode 渠道编码
     * @param webchat     微信号
     * @param password    密码
     * @return 返回执行后的结果
     */
    public Map<String, Object> loginByWebchat(String channelCode, String webchat, String password);

    /**
     * 根据微信号和密码登录
     *
     * @param channelCode 渠道编码
     * @param idCard      身份证号
     * @return 返回执行后的结果
     */
    public Map<String, Object> loginOutByWebchat(String channelCode, String idCard);

    /**
     * 查询用户基本信息（返回基本信息、绑定设备微信号信息、关联患者信息）
     *
     * @param idCard      身份证号
     * @param channelCode 渠道编码
     * @param user        用户
     * @return
     */
    public Map<String, Object> loadInfo(String idCard, String channelCode, String user);

    /**
     * 注销登录的用户
     *
     * @param channelCode 渠道编码
     * @param username    用户名
     * @param imei        手机设备IMEI号
     * @param openId      微信或其他网页登录唯一身份识别码
     * @param source      来源：1.安卓，2.IOS  3微网站
     * @return
     */
    public Map<String, Object> logout(String channelCode, String username, String imei, String openId, String source);

    /**
     * 根据openID查询用户信息
     *
     * @param channelCode 渠道编码
     * @param openId      身份认证ID
     * @return
     */
    public Map<String, Object> loadUserInfoByOpenId(String channelCode, String openId);

    /**
     * 根据openID查询用户信息(加医保)
     *
     * @param channelCode 渠道编码
     * @param openId      身份认证ID
     * @return
     */
    public Map<String, Object> loadInsuranceUserInfoByOpenId(String channelCode, String openId);

    /**
     * 修改默认就诊人
     *
     * @param channelCode 渠道编码
     * @param personId    就诊人ID
     * @param user        用户
     * @return
     */
    public Map<String, Object> modifyDefaultPersonHandler(String channelCode, String personId, String user);

    /**
     * 检查手机号状态
     *
     * @param channelCode
     * @param phone
     * @return
     */
    public Map<String, Object> checkPhoneStatus(String channelCode, String phone);

    /**
     * 校验验证码
     *
     * @param channelCode 渠道编码
     * @param phone       手机号
     * @param vcode       验证码
     * @return
     */
    public Map<String, Object> verificationCodeHandler(String channelCode, String phone, String vcode);

    /**
     * 加载病症列表
     *
     * @param channelCode  渠道编码
     * @param hospitalCode 医院编码
     * @param partId       部位Id
     * @return
     */
    Map<String, Object> loadSymptomData(String channelCode, String hospitalCode, String partId);

    /**
     * 加载病症列表
     *
     * @param channelCode  渠道编码
     * @param hospitalCode 医院编码
     * @param symId        症状编码
     * @return
     */
    Map<String, Object> loadSymMapData(String channelCode, String hospitalCode, String symId);

    /**
     * 加载病症列表
     *
     * @param channelCode  渠道编码
     * @param hospitalCode 医院编码
     * @param symMapIdList symMapIdList
     * @return
     */
    Map<String, Object> loadDzDeptClass(String channelCode, String hospitalCode, List<String> symMapIdList);

    /**
     * 加载病症列表
     *
     * @param channelCode  渠道编码
     * @param hospitalCode 医院编码
     * @param dept_class 科室类
     * @return
     */
    Map<String, Object> loadDeptOfClass(String channelCode, String hospitalCode, String dept_class);

    /**
     * 加载病症列表
     *
     * @param channelCode  渠道编码
     * @param hospitalCode 医院编码
     * @param docName 科室类
     * @return
     */
    Map<String, Object> loadDoctor(String channelCode, String hospitalCode, String docName);

    /**
     * 修改医保卡号
     *
     * @param channelCode  渠道编码
     * @param insurNo 医保卡号
     * @param personId 就诊人身份证号
     * @return
     */
    Map<String, Object> modifyInsurance(String channelCode, String insurNo, String personId);

    /**
     * 加载病症列表
     * @param channelCode  渠道编码
     * @param user  用户手机号
     * @return
     */
    Map<String, Object> loadOpenId(String user, String channelCode);

    /**
     * 患者住院身份验证状态修改
     * @param relatedUserId 注册用户手机号
     * @param personId 被绑定人身份证号
     * @param state 用户状态
     * @param verificationState 验证患者住院身份状态
     * @return
     */
    Map<String, Object> UserVerificationStateUpdateAgent(String relatedUserId, String personId, String state,String verificationState);
}
